package main // 必须有一个main包

import "fmt" // 包含了模块必须要使用

func main() { // 左大括号必须在函数这一行 有且仅有一个main入口

	var a int = 1 // 声明了变量必须要使用

	// var a float64 = 5.33 // 不能声明同名变量

	// 自动类型推导
	b := 4 + a

	// 多重赋值
	a, b = 10, 20
	a, b = b, a

	// 格式化输出
	fmt.Printf("a = %d b = %d\n", a, b)

	const c int = 3
	const d = 4 // 常量不用:=自动推导
	fmt.Println(c, d)

	// 多类型变量的简便声明
	var (
		m         = 1 // 变量这里自动推导不用:=
		n float64 = 3.14
	)
	fmt.Printf("type of m is %T, type of n is %T\n", m, n)
	// 常量同理
	const (
		i         = 100
		j float32 = 2.6
	)

	// iota枚举 用于常量 每隔一行自动+1
	const (
		a1     = iota
		b1, e1 = iota, iota
		c1     = iota
	)
	fmt.Println(a1, b1, e1, c1) // b1 e1相等
	// 下一个const自动重置为0
	const d1 = iota
	fmt.Println(d1)
	// 可以只写一个iota
	const (
		f1 = iota
		g1
		j1
	)
	fmt.Println(f1, g1, j1)

	// 为类型起别名
	type bigint int64
	var h bigint
	fmt.Printf("type of h is %T\n", h) // main.bigint
	// 多个一起
	type (
		long int64
		char byte
	)
	var cc char = 97
	fmt.Printf("cc is %c\n", cc)

	// fmt.Scan(&a, &b)
	// fmt.Println(a, b)

	// 复数
	var ccc = complex(2, 3)
	cccc := imag(ccc) //虚部
	fmt.Println(cccc)

	// 循环
	for a := 0; a < 3; a++ {
		fmt.Println(a)
	}
	// 数组遍历
	aa := [...]int{1, 3, 4, 6}
	for p, v := range aa {
		fmt.Println(p, v)
	}
}
